最后更新时间:2019年6月17日
离线地图显示方法
离线地图数据类型包括离线矢量地图和离线瓦片地图,两种地图加载显示的方式也略有不同:
加载地图有多种方法,不同的方法适用于不同的数据类型,具有不同的应用场景。离线矢量地图、离线瓦片地图显示的核心方法如下表所示,从表中可以观察到,它们具有三种相同的方法,另外各自具有一种独有的方法,开发者可根据数据类型、实际需求来确定采用哪种方法。
方法 | 接口 | 地图类型 | 使用场景 |
---|---|---|---|
加载地图文档 | loadFromFile / loadFromFileAsync | 矢量 / 瓦片 | 最常用,适于地图文档中只有一个地图的情况,若有多个地图则默认加载第一个。 |
加载地图文档对应索引的地图 | loadFromDocument / loadFromDocumentAsync | 矢量 / 瓦片 | 适于加载有多个地图的地图文档,可控制加载某个地图。 |
通过地图文档获取Map | setMap / setMapAsync | 矢量 / 瓦片 | 适于加载地图之前需处理的情况,如删除部分图层、获取信息等。 |
通过数据库创建图层,从而构建Map | setMap / setMapAsync | 矢量 | 若获取到的数据只有“.mgdb”,无“.mapx”时,只能采用此方法。 |
基于ServerLayer实例化Map | setMap / setMapAsync | 瓦片 | 直接使用代加载瓦片地图,不用在桌面工具中配置地图文档。 |
一、加载地图文档
调用loadFromDocument / loadFromDocumentAsync方法加载地图文档,此方法是加载离线地图最常用、最简单的一种。前提是必须事先组织配置好mapx地图文档文件。
//引用类库(无需开发人员手动编写) import com.zondy.mapgis.android.mapview.MapView; import com.zondy.mapgis.android.environment.Environment.AuthorizeCallback; //定义MapView对象 private MapView mMapView; //获取移动端设备sd卡的根目录 public final static String rootPath = Environment.getExternalStorageDirectory().getPath(); public final static String systemPath = Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 2D Sample/"; //环境初始化,必须在使用SDK各组件之前调用,会自动建立根目录结构 com.zondy.mapgis.android.environment.Environment.initialize(systemPath, this); //授权请求 com.zondy.mapgis.android.environment.Environment.requestAuthorization(this, new AuthorizeCallback() { @Override //授权完成后回调 public void onComplete() { //获取MapView对象 mMapView = (MapView) findViewById(R.id.mapView); //同步方法 mMapView.loadFromFile(MainActivity.rootPath + "/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx"); //异步方法 mMapView.loadFromFileAsync(MainActivity.rootPath + "/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx"); //异步加载地图回调监听 mMapView.setMapLoadListener(new MapView.MapViewMapLoadListener() { @Override public void mapViewWillStartLoadingMap(MapView arg0, String arg1) { //开始加载地图 } @Override public void mapViewDidFinishLoadingMap(MapView arg0, String arg1) { //地图加载完成 } @Override public void mapViewDidFailLoadingMap(MapView arg0, String arg1) { //地图加载失败 } }); } });
代码说明:如果采用异步方法加载地图,可以为地图视图设置地图加载回调监听器,监听地图的加载情况。
二、加载地图文档对应索引的地图
通过loadFromDocument / loadFromDocumentAsync来加载地图文档对应索引的地图,可以加载mapx地图文档中的指定地图,同样适用于离线矢量地图、离线瓦片地图。
//创建文档对象 Document mapDoc = new Document(); //打开地图文档 mapDoc.open(MainActivity.rootPath+"/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx"); //同步方法:在地图视图中加载第1个地图 mMapView.loadFromDocument(mapDoc, 0); //异步方法:利用地图加载完成的回调方法判断地图加载是否成功 mMapView.loadFromDocumentAsync(mapDoc, 0, new MapViewFinishCallback() { @Override public void onDidFinish(boolean arg0) { if (arg0) { //地图加载完成 } else { //地图加载失败 } } });
三、通过地图文档获取Map
通过地图文档Document获取Map,调用setMap / setMapAsync方法加载地图。同样可以加载地图文档中指定的地图。
//创建文档对象 Document mapDoc = new Document(); //打开地图文档 mapDoc.open(MainActivity.rootPath+"/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx"); //通过地图文档获取地图对象 map = mapDoc.getMaps().getMap(0); //同步方法:通过地图视图对象设置地图 mMapView.setMap(map); //异步方法:可监听地图的加载情况 mMapView.setMapAsync(map, new MapViewFinishCallback() { @Override public void onDidFinish(boolean arg0) { if (arg0) { //地图加载完成 } else { //地图加载失败 } } });
代码说明:利用setMap或setMapAsync将地图Map赋予给地图视图MapView时,Map对象需定义为成员变量,从而实现生命周期的正确管理。
四、通过数据库创建图层构建Map
通过通过数据库DataBase获取数据,创建图层,从而构建Map,然后调用setMap / setMapAsync方法加载地图。此方法只适用于离线矢量数据,针对获取的数据中只有.mgdb数据库,无.mapx地图文档时。
//构造数据库对象,并打开 DataBase dataBase=new DataBase(); dataBase.open(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/武汉MKT.mgdb"); if(dataBase.hasOpened()){ //获取所有简单要素类的ID IntList list1=dataBase.getXclseIDs(XClsType.SFCls, 0); for (int i = 0; i < list1.size(); i++) { //根据ID从数据库中获取简单要素类信息 FClsInfo fclsinfo=(FClsInfo) dataBase.getXclsInfo(XClsType.SFCls,list1.get(i)); //创建VectorLayer图层对象,设置URL和名称 VectorLayer vectorLayer=new VectorLayer(VectorLayerType.SFclsLayer); vectorLayer.setURL(fclsinfo.getURL()); vectorLayer.setName(fclsinfo.getName()); //添加图层到map中 map.append(vectorLayer); } //获取所有注记类的ID IntList list2=dataBase.getXclseIDs(XClsType.ACls, 0); for (int i = 0; i < list2.size(); i++) { //获取注记类信息 AnnClsInfo annClsInfo=(AnnClsInfo)dataBase.getXclsInfo(XClsType.ACls,list2.get(i)); //创建VectorLayer图层对象,设置URL和名称 VectorLayer vectorLayer=new VectorLayer(VectorLayerType.AnnotationLayer); vectorLayer.setURL(annClsInfo.getURL()); vectorLayer.setName(annClsInfo.getName()); //添加图层到map中 map.append(vectorLayer); } //同步加载地图 mapView.setMap(map); //异步加载地图 mapView.setMapAsync(map, new MapViewFinishCallback() { @Override public void onDidFinish(boolean arg0) { if (arg0) { //地图加载完成 } else { //地图加载失败 } } }); }
五、基于ServerLayer实例化Map
通过服务图层ServerLayer实例化Map,然后调用setMap / setMapAsync方法加载地图。离线瓦片地图能够采用此方法,不适用于离线矢量地图。此方法加载离线瓦片数据不用将其组织为地图文档,直接加载.TDF格式的瓦片数据文件即可。
//创建MapServer对象 MapServer mapServer = ServerLayer.createMapServerByType(MapServerType.MapGISHDF); //设置服务图层数据的url,即离线瓦片数据的存放路径 mapServer.setURL(MainActivity.rootPath+"/MapGIS Demo/Map/MapShow/WorldMKTTile.TDF"); //设置服务图层的数据源 serverLayer.setMapServer(mapServer); //设置图层名称 serverLayer.setName("离线服务图层"); //获取Map对象 mMap = mMapView.getMap(); //方式一:append()添加图层 mMap.append(serverLayer); //方式二:insert()插入图层 //mMap.insert(0, serverLayer); //同步方法:将地图对象显示在地图容器中 mapView.setMap(map); //异步方法: mMapView.setMapAsync(map, new MapView.MapViewFinishCallback() { @Override public void onDidFinish(boolean arg0) { if (arg0) { //地图加载成功 } else { //地图加载失败 } } });
显示效果如下所示: